package units;

import java.io.Serializable;

public class Time implements Serializable {

    private static final long serialVersionUID = 7849276757125569892L;
    protected long ano; //0 é o ano de início do universo || fundação da FIG (?)
    protected long dia; //um ano tem 12^2 dias
    protected long segundo; //um dia tem 12^5 segundos
    public static final long SEGS_DIA = 248832, DIAS_ANO = 144;

    public Time() {
        this(0);
    }

    public Time(long segundosTotais) {
        final long segsAno = SEGS_DIA * DIAS_ANO;
        ano = segundosTotais / (segsAno);
        segundosTotais %= segsAno;

        dia = segundosTotais / SEGS_DIA;
        segundo = segundosTotais % SEGS_DIA;
    }

    public Time(long ano, long dia, long segundo) {
        this.ano = ano;
        this.dia = dia;
        this.segundo = segundo;

        this.simplificar();
    }

    public long getAno() {
        return ano;
    }

    public long getDia() {
        return dia;
    }

    public long getSegundo() {
        return segundo;
    }

    public long getSegundosAno() {
        return dia * SEGS_DIA + segundo;
    }

    public long getSegundosTotais() {
        return ano * DIAS_ANO * SEGS_DIA + getSegundosAno();
    }

    public void addSegundos(long segundos) {
        add(segundos, 0, 0);
    }

    public void addDias(long dias) {
        add(0, dias, 0);
    }

    public void addAnos(long anos) {
        add(0, 0, anos);
    }

    public void add(Time t) {
        add(t.segundo, t.dia, t.ano);
    }

    public void add(long segundos, long dias, long anos) {
        this.segundo += segundos;
        this.dia += dias;
        this.ano += anos;
        this.simplificar();
    }

    public void removeSegundos(long segundos) {
        remove(segundos, 0, 0);
    }

    public void removeDias(long dias) {
        remove(0, dias, 0);
    }

    public void removeAnos(long anos) {
        remove(0, 0, anos);
    }

    public void remove(Time t) {
        remove(t.segundo, t.dia, t.ano);
    }

    public long diferenca(Time t) {
        return this.getSegundosTotais() - t.getSegundosTotais();
    }

    public void remove(long segundos, long dias, long anos) {
        this.segundo -= segundos;
        this.dia -= dias;
        this.ano -= anos;
        this.simplificar();
    }

    public void simplificar() {
        if (segundo < 0 || segundo > SEGS_DIA) {
            dia += segundo / SEGS_DIA;
            segundo %= SEGS_DIA;
        }

        if (dia < 0 || dia > DIAS_ANO) {
            ano += dia / DIAS_ANO;
            dia %= DIAS_ANO;
        }
    }
}